import logging

from PySide6.QtGui import Qt

from 程序核心代码.mvvm重构.基础定义.节点管理器.动态数据调度器.属性管理器 import 属性管理基类

# 设置日志记录的基本配置
logging.basicConfig(level=logging.ERROR, format='%(asctime)s - %(levelname)s - %(message)s')
日志记录器 = logging.getLogger(__name__)


class 节点模型基类(属性管理基类):
    def __init__(self, **kwargs):
        super().__init__()
        self.调试模式 = False
        # 设置日志等级
        if self.调试模式:
            日志记录器.setLevel(logging.DEBUG)
            日志记录器.debug(f"{self.__class__.__name__}调试模式已开启")
        else:
            日志记录器.setLevel(logging.ERROR)  # 只显示警告及以上级别的日志
        self._图形项 = None
        日志记录器.info(f"模型基类初始化: {kwargs}")
        self.模型初始化(kwargs)

    def 模型初始化(self, kwargs):
        for key, value in kwargs.items():
            if not isinstance(key, str):
                raise ValueError("属性名必须是字符串")
            self.设置属性触发函数(key, value)

    @property
    def 图形项(self):
        if self._图形项 is None:
            raise ValueError("图形项未绑定")
        return self._图形项

    @图形项.setter
    def 图形项(self, 图形):
        if self._图形项:
            try:
                self.图形项.属性变化信号.disconnect(self.设置属性触发函数)
            except TypeError as e:
                日志记录器.error(f"解除绑定失败: {e}")
            self._图形项 = None
        # if 图形 is not None and not isinstance(图形, 节点图形项基类):
        #     raise ValueError("图形项必须是图形项基类的实例")
        self._图形项 = 图形
        if self._图形项:
            self.图形项.属性变化信号.connect(self.设置属性触发函数, Qt.QueuedConnection)

class  节点图形项基类(属性管理基类):
    def __init__(self, 模型: 节点模型基类):
        if not isinstance(模型, 节点模型基类):
            raise ValueError("模型必须是模型基类的实例")
        self.调试模式 = False
        # 设置日志等级
        if self.调试模式:
            日志记录器.setLevel(logging.DEBUG)
            日志记录器.debug(f"{self.__class__.__name__}调试模式已开启")
        else:
            日志记录器.setLevel(logging.ERROR)  # 只显示警告及以上级别的日志
        日志记录器.info(f"图形项基类初始化: {模型}")
        super().__init__()
        self._模型 = 模型
        self._模型.属性变化信号.connect(self.设置属性触发函数, Qt.QueuedConnection)
        self.属性准备就绪 = False
        self.图形项 = self
        self._初始图形项属性()
        日志记录器.info(f"图形项基类初始化完成: {模型}")

    def _初始图形项属性(self):
        for 属性名, 属性值 in self._模型.属性.items():
            self._设置自身属性(属性名, 属性值)
